/*
 * This file is part of TradeHelper library.
 *
 * TradeHelper library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * TradeHelper library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with TradeHelper library.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.rag.managers;

import com.alee.managers.settings.SettingsManager;
import com.alee.utils.collection.ValuesTable;
import com.rag.core.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * User: mgarin Date: 04.04.12 Time: 16:35
 */

public class RagManager
{
    private static RagData ragData;
    private static ValuesTable<String, Item> knownItems;
    private static Map<String, List<String>> knownSynonyms;

    private static boolean initialized = false;

    /**
     * Инициализируем раг-менеджер
     */

    public static void initialize ()
    {
        if ( !initialized )
        {
            initialized = true;

            // Загрузка базы
            loadData ();

            // Загрузка известных синонимов
            loadSynonyms ();
        }
    }

    /**
     * Известные данные
     */

    public static RagData getRagData ()
    {
        return ragData;
    }

    /**
     * Загружаем список интересных нам итемы
     */

    private static void loadData ()
    {
        // Исходный пустой список итемов
        knownItems = new ValuesTable<String, Item> ();

        try
        {
            // Загружаем локально закэшированные данные
            ragData = ( RagData ) SettingsManager.getSettings ( UpdateManager.localDataFile );

            // Переводим список в удобный для испоьзования вид
            for ( Item item : ragData.getItems () )
            {
                knownItems.add ( item.getId (), item );
            }
        }
        catch ( Throwable e )
        {
            e.printStackTrace ();
        }
    }

    /**
     * Получаем итемы по ID
     */

    public static Item getItem ( int id )
    {
        return getItem ( "" + id );
    }

    public static Item getItem ( String id )
    {
        return knownItems.get ( id );
    }

    public static List<Item> getItems ( List<String> ids )
    {
        List<Item> items = new ArrayList<Item> ();
        if ( ids != null )
        {
            for ( String id : ids )
            {
                Item item = getItem ( id );
                if ( item != null )
                {
                    items.add ( item );
                }
            }
        }
        return items.size () > 0 ? items : null;
    }

    /**
     * Известные итемы
     */

    public static ValuesTable<String, Item> getKnownItems ()
    {
        return knownItems;
    }

    /**
     * Загружаем список известных нам синонимов
     */

    private static void loadSynonyms ()
    {
        // Исходный пустой список синонимов
        knownSynonyms = new HashMap<String, List<String>> ();

        try
        {
            // Загружаем локально закэшированный список синонимов
            SynonymData synonymData =
                    ( SynonymData ) SettingsManager.getSettings ( UpdateManager.localSynonymsFile );

            // Переводим список в удобный для испоьзования вид
            for ( Synonym synonym : synonymData.getSynonyms () )
            {
                knownSynonyms.put ( synonym.getId (), synonym.getSynonymsList () );
            }
        }
        catch ( Throwable e )
        {
            e.printStackTrace ();
        }
    }

    /**
     * Известные синонимы
     */

    public static List<String> getKnownSynonyms ( String id )
    {
        return knownSynonyms.get ( id );
    }

    public static Map<String, List<String>> getKnownSynonyms ()
    {
        return knownSynonyms;
    }

    /**
     * Получаем список синонимов названия итема
     */

    public static List<String> getItemSynonyms ( Item item )
    {
        List<String> synonyms = new ArrayList<String> ();

        // Имя итема
        synonyms.add ( item.getTitle () );
        synonyms.add ( item.getTitle ().replaceAll ( " ", "" ) );

        // Синоним имени
        if ( item.getSynonym () != null )
        {
            synonyms.add ( item.getSynonym () );
            synonyms.add ( item.getSynonym ().replaceAll ( " ", "" ) );
        }

        // Специальные синонимы карточек
        if ( item.getItemType ().equals ( ItemType.card ) )
        {
            // Краткое имя
            String cardName = item.getTitle ().replaceAll ( " Card", "" );
            synonyms.add ( cardName );
            synonyms.add ( cardName.replaceAll ( " ", "" ) );

            // Не используется как синонимы, однако используется при парсинге имён итемов для добавления карт
            // Суффикс или префикс
            //            String cardSuffix = item.getCardSuffix ();
            //            if ( cardSuffix != null )
            //            {
            //                synonyms.add ( cardSuffix );
            //                synonyms.add ( cardSuffix.replaceAll ( " ", "" ) );
            //            }
        }

        // Сторонние синонимы
        List<String> knownSynonyms = getKnownSynonyms ( item.getId () );
        if ( knownSynonyms != null && knownSynonyms.size () > 0 )
        {
            for ( String synonym : knownSynonyms )
            {
                synonyms.add ( synonym );
                if ( synonym.contains ( " " ) )
                {
                    synonyms.add ( synonym.replaceAll ( " ", "" ) );
                }
            }
        }

        // todo Сводить синонимы в нижний регистр

        return synonyms;
    }
}